package com.starhub.domain.knowledge.service;

import com.starhub.application.collection.dto.DataDefinitionLinkDto;
import com.starhub.domain.knowledge.dto.KnowledgeBaseDto;
import com.starhub.domain.knowledge.dto.KnowledgeCollectionDto;
import com.starhub.domain.knowledge.vo.KnowledgeBaseVo;
import com.starhub.domain.knowledge.vo.KnowledgeCollectionVo;

import java.util.List;

/**
 * 知识库设置Service接口
 * @version: V1.0
 * @author: liuhf
 * @time 2025-06-06
 */
public interface KnowledgeSettingService {
    
    /**
     * 创建知识库
     * @param knowledgeBase 知识库信息
     * @return 是否创建成功
     */
    boolean createKnowledgeBase(KnowledgeBaseDto knowledgeBase);

    /**
     * 更新知识库
     * @param knowledgeBase 知识库信息
     * @return 是否更新成功
     */
    boolean updateKnowledgeBase(KnowledgeBaseDto knowledgeBase);

    /**
     * 删除知识库（软删除）
     * @param id 知识库ID
     * @return 是否删除成功
     */
    boolean deleteKnowledgeBase(Long id);

    /**
     * 创建知识库表
     * @param knowledgeCollection 知识库表信息
     * @return 是否创建成功
     * @throws IllegalArgumentException 参数校验失败
     * @throws RuntimeException Milvus操作失败
     */
    boolean createKnowledgeCollection(KnowledgeCollectionDto knowledgeCollection);

    /**
     * 更新知识库表
     * @param knowledgeCollection 知识库表信息
     * @return 是否更新成功
     * @throws IllegalArgumentException 参数校验失败
     */
    boolean updateKnowledgeCollection(KnowledgeCollectionDto knowledgeCollection);

    /**
     * 删除知识库表（软删除）
     * @param id 知识库表ID
     * @return 是否删除成功
     */
    boolean deleteKnowledgeCollection(Long id);

    /**
     * 根据ID获取知识库
     * @param id 知识库ID
     * @return 知识库信息
     */
    KnowledgeBaseVo getKnowledgeBaseById(Long id);

    /**
     * 根据ID获取知识库表
     * @param id 知识库表ID
     * @return 知识库表信息
     */
    KnowledgeCollectionVo getKnowledgeCollectionById(Long id);

    /**
     * 添加主数据表和元数据表的关联
     *
     * @param dataDefinitionLinkDto
     * @return
     */
    boolean addLink(DataDefinitionLinkDto dataDefinitionLinkDto);

    /**
     * 移除主数据表和元数据表的关联
     *
     * @param dataDefinitionLinkDto
     * @return
     */
    boolean removeLink(DataDefinitionLinkDto dataDefinitionLinkDto);

    /**
     * 获取元数据关联设置
     *
     * @param mainCollection 主数据表ID
     * @return 元数据关联设置
     */
    List<KnowledgeCollectionVo> getLinks(Long mainCollection);
}
